/**
请你编写一段可应用于所有数组的代码，使任何数组调用 array. groupBy(fn) 方法时，它返回对该数组 **分组后** 的结果。
数组 分组 是一个对象，其中的每个键都是 fn(arr[i]) 的输出的一个数组，该数组中含有原数组中具有该键的所有项。
提供的回调函数 fn 将接受数组中的项并返回一个字符串类型的键。
每个值列表的顺序应该与元素在数组中出现的顺序相同。任何顺序的键都是可以接受的。
请在不使用 lodash 的 _.groupBy 函数的前提下解决这个问题。
示例 1：
输入：
array = [
  {"id":"1"},
  {"id":"1"},
  {"id":"2"}
], 
fn = function (item) { 
  return item.id; 
}
输出：
{ 
  "1": [{"id": "1"}, {"id": "1"}],   
  "2": [{"id": "2"}] 
}
解释：
输出来自函数 array.groupBy(fn)。
分组选择方法是从数组中的每个项中获取 "id" 。
有两个 "id" 为 1 的对象。所以将这两个对象都放在第一个数组中。
有一个 "id" 为 2 的对象。所以该对象被放到第二个数组中。
 */

//for..of遍历实现
Array.prototype.groupBy = function(fn) {
  const res = {};
  for(const item of this) {
    const key = fn(item);
    res[key] ||=[];
    res[key].push(item);
  }
  return res;
};
//reduce方法实现
Array.prototype.groupBy = function(fn) {
  return this.reduce((pre,item) => {
    const key = fn(item);
    pre[key] ||= [];
    pre[key].push(item);
    return pre;
  }, {})
}